#include "./utils/ota_info.h"
#include "./device/compat.h"

using namespace utils;
using namespace driver;

void runApp() {

	auto sp = *reinterpret_cast<const volatile uint32_t *>(flash::APP_ADDR);
	auto pc = *reinterpret_cast<const volatile uint32_t *>(flash::APP_ADDR + 4);
	auto app = reinterpret_cast<void (*)(void)>(pc);
	__set_MSP(sp);
	app();	    
}

void runOta() {
    flash::move(flash::APP_ADDR, flash::OTA_DATA_ADDR, ota_info->pkg_size);
    ota_info.erase();
}

int main() {
	Error err = ota_info.load();
    if (err.is_ok() && ota_info->is_valid()) {
        runOta();
    }
    runApp();
}
